package net.aiion.weave.spi.bytecode;

import net.aiion.weave.spi.bytecode.events.AnnotationDefaultStartBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.AnnotationStartBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.AttributeBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.CodeEndBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.CodeStartBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.FieldInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.FrameBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.IincInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.InstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.IntInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.InvokeDynamicInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.JumpInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.LabelBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.LineNumberBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.LoadConstantInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.LocalVariableBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.LookupSwitchInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.MethodEndBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.MethodInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.MultiANewArrayInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.ParameterAnnotationStartBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.TableSwitchInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.TryCatchBlockBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.TypeInstructionBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.VariableInstructionBytecodeEvent;

public interface BytecodeMethodVisitor extends BytecodeVisitor
{
    BytecodeAnnotationVisitor visitAnnotationDefaultStart(
        AnnotationDefaultStartBytecodeEvent aAnnotationDefaultStartBytecodeEvent);

    BytecodeAnnotationVisitor visitAnnotationStart(AnnotationStartBytecodeEvent aAnnotationStartBytecodeEvent);

    BytecodeAnnotationVisitor visitParameterAnnotationStart(
        ParameterAnnotationStartBytecodeEvent aParameterAnnotationStartBytecodeEvent);

    void visitAttribute(AttributeBytecodeEvent aAttributeBytecodeEvent);

    void visitCodeStart(CodeStartBytecodeEvent aCodeStartBytecodeEvent);

    void visitFrame(FrameBytecodeEvent aFrameBytecodeEvent);

    void visitFieldInstruction(FieldInstructionBytecodeEvent aFieldInstructionBytecodeEvent);

    void visitIincInstruction(IincInstructionBytecodeEvent aIincInstructionBytecodeEvent);

    void visitInstruction(InstructionBytecodeEvent aInstructionBytecodeEvent);

    void visitIntInstruction(IntInstructionBytecodeEvent aIntInstructionBytecodeEvent);

    void visitInvokeDynamicInstruction(InvokeDynamicInstructionBytecodeEvent aInstructionBytecodeEvent);

    void visitJumpInstruction(JumpInstructionBytecodeEvent aJumpInstructionBytecodeEvent);

    void visitLoadConstantInstruction(LoadConstantInstructionBytecodeEvent aLoadConstantInstructionBytecodeEvent);

    void visitLookupSwitchInstruction(LookupSwitchInstructionBytecodeEvent aLookupSwitchInstructionBytecodeEvent);

    void visitMethodInstruction(MethodInstructionBytecodeEvent aMethodInstructionBytecodeEvent);

    void visitMultiANewArrayInstruction(MultiANewArrayInstructionBytecodeEvent aMultiANewArrayInstructionBytecodeEvent);

    void visitTableSwitchInstruction(TableSwitchInstructionBytecodeEvent aTableSwitchInstructionBytecodeEvent);

    void visitTypeInstruction(TypeInstructionBytecodeEvent aTypeInstructionBytecodeEvent);

    void visitVariableInstruction(VariableInstructionBytecodeEvent aVariableInstructionBytecodeEvent);

    void visitLabel(LabelBytecodeEvent aLabelBytecodeEvent);

    void visitTryCatchBlock(TryCatchBlockBytecodeEvent aTryCatchBlockBytecodeEvent);

    void visitLocalVariable(LocalVariableBytecodeEvent aLocalVariableBytecodeEvent);

    void visitLineNumber(LineNumberBytecodeEvent aLineNumberBytecodeEvent);

    void visitCodeEnd(CodeEndBytecodeEvent aCodeEndBytecodeEvent);

    void visitMethodEnd(MethodEndBytecodeEvent aMethodEndBytecodeEvent);
}
